home *** CD-ROM | disk | FTP | other *** search
/ Skunkware 5 / Skunkware 5.iso / src / X11 / xpaint-2.1.1 / size.c < prev    next >
C/C++ Source or Header  |  1995-05-03  |  4KB  |  132 lines

  1. /* +-------------------------------------------------------------------+ */
  2. /* | Copyright 1992, 1993, David Koblas (koblas@netcom.com)            | */
  3. /* |                                                                   | */
  4. /* | Permission to use, copy, modify, and to distribute this software  | */
  5. /* | and its documentation for any purpose is hereby granted without   | */
  6. /* | fee, provided that the above copyright notice appear in all       | */
  7. /* | copies and that both that copyright notice and this permission    | */
  8. /* | notice appear in supporting documentation.  There is no           | */
  9. /* | representations about the suitability of this software for        | */
  10. /* | any purpose.  this software is provided "as is" without express   | */
  11. /* | or implied warranty.                                              | */
  12. /* |                                                                   | */
  13. /* +-------------------------------------------------------------------+ */
  14.  
  15. #include <X11/StringDefs.h>
  16. #include <X11/Intrinsic.h>
  17. #include <X11/Shell.h>
  18. #include <X11/Xaw/Dialog.h>
  19. #include <X11/Xaw/Command.h>
  20. #include <X11/Xaw/Toggle.h>
  21. #include <X11/Xaw/Form.h>
  22. #include <X11/Xaw/Label.h>
  23. #include <X11/Xaw/AsciiText.h>
  24. #include <X11/Xaw/Text.h>
  25. #include <stdio.h>
  26.  
  27. #ifndef NOSTDHDRS
  28. #include <stdlib.h>
  29. #include <unistd.h>
  30. #endif
  31.  
  32. #include "Paint.h"
  33. #include "misc.h"
  34. #include "text.h"
  35.  
  36. typedef struct {
  37.     Widget        widget, paint;
  38.     Dimension    w, h;
  39.     int        z;
  40.     void        (*func)(Widget, int, int, int);
  41. } arg_t;
  42.  
  43. static void cancelSizeCallback(Widget w, XtPointer arg, XtPointer junk)
  44. {
  45.     XtFree((XtPointer)arg);
  46. }
  47.  
  48. static void sureCallback(Widget w, XtPointer argArg, XtPointer junk)
  49. {
  50.     arg_t    *arg = (arg_t *)argArg;
  51.     XtVaSetValues(arg->paint, XtNdrawWidth, arg->w,
  52.                   XtNdrawHeight, arg->h,
  53.                   NULL);
  54.  
  55.     XtFree((XtPointer)arg);
  56. }
  57.  
  58. static void okSizeCallback(Widget w, XtPointer argArg, XtPointer infoArg)
  59. {
  60.     arg_t        *arg = (arg_t *)argArg;
  61.     TextPromptInfo    *info = (TextPromptInfo *)infoArg;
  62.     Dimension    width, height;
  63.  
  64.     arg->w = atoi(info->prompts[0].rstr);
  65.     arg->h = atoi(info->prompts[1].rstr);
  66.     if (arg->paint == None)
  67.         arg->z = atoi(info->prompts[2].rstr);
  68.  
  69.     if (arg->paint != None)
  70.         XtVaGetValues(arg->paint, XtNdrawWidth, &width,
  71.                       XtNdrawHeight, &height,
  72.                       NULL);
  73.  
  74.     if (arg->w <= 0) {
  75.         Notice(w, "Invalid width");
  76.     } else if (arg->h <= 0) {
  77.         Notice(w, "Invalid height");
  78.     } else if (arg->paint == None) {
  79.         arg->func(arg->widget, arg->w, arg->h, arg->z);
  80.     } else if (arg->w != width || arg->h != height) {
  81.         AlertBox(GetShell(arg->paint), "Warning this operation is cannot be undone\nContinue?",
  82.                 sureCallback, cancelSizeCallback, arg);
  83.         /* don't free */
  84.         return;
  85.     }
  86.  
  87.     XtFree((XtPointer)arg);
  88. }
  89.  
  90. void SizeSelect(Widget w, Widget paint, void (*func)(Widget, int, int, int))
  91. {
  92.     static TextPromptInfo        info;
  93.     static struct textPromptInfo    values[4];
  94.     int            width, height, zoom;
  95.     arg_t            *arg = XtNew(arg_t);
  96.     char            bufA[16], bufB[16], bufC[16];
  97.  
  98.     info.prompts = values;
  99.     info.nprompt = (paint == None) ? 3 : 2;
  100.     info.title   = "Enter the desired image size:";
  101.  
  102.     values[0].prompt = "Width:";
  103.     values[0].str    = bufA;
  104.     values[0].len    = 5;
  105.     values[1].prompt = "Height:";
  106.     values[1].str    = bufB;
  107.     values[1].len    = 5;
  108.     values[2].prompt = "Zoom:";
  109.     values[2].str    = bufC;
  110.     values[2].len    = 5;
  111.  
  112.     if (paint != None) {
  113.         XtVaGetValues(paint, XtNdrawWidth, &width,
  114.                  XtNdrawHeight, &height,
  115.                  XtNzoom, &zoom,
  116.                  NULL);
  117.     } else {
  118.         GetDefaultWH(&width, &height);
  119.         zoom = 1;
  120.     }
  121.  
  122.     sprintf(bufA, "%d", (int)width);
  123.     sprintf(bufB, "%d", (int)height);
  124.     sprintf(bufC, "%d", (int)zoom);
  125.  
  126.     arg->widget = w;
  127.     arg->paint  = paint;
  128.     arg->func   = func;
  129.  
  130.     TextPrompt(w, "sizeselect", &info, okSizeCallback, cancelSizeCallback, arg);
  131. }
  132.